package com.dwfyc.managedBean.documento;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

import com.dwfyc.fachada.IGestionDocumento;
import com.dwfyc.fachada.IGestionTipos;
import com.dwfyc.hibernate.Documento;
import com.dwfyc.hibernate.Tipos;
import com.icesoft.faces.component.ext.RowSelectorEvent;

@Transactional
public class EliminarDocBean{
	private String nombre;
	private String descripcion;
	private String caducidad;
	//private String[] tipo = { "tipo1", "tipo2" };
	private List<Documento> listaDocumentos; 
	private boolean verPopup = false;
	private String popupCabecera = new String();
	private String popupCuerpo = new String();
	
	
	private Logger log = Logger.getLogger(this.getClass());
	private IGestionTipos gt;	
	private IGestionDocumento gd;
	
	
	public void metodoInicial(){
		try{
			listaDocumentos = gd.getAllDocumentosConTipos();			
		}catch (Exception e) {
		
			log.debug(this.getClass() + "Hubo excepcion: "+e.getLocalizedMessage());
		}
	}
	
	
	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getCaducidad() {
		return caducidad;
	}

	public void setCaducidad(String caducidad) {
		this.caducidad = caducidad;
	}

	public IGestionTipos getGt() {
		return gt;
	}

	public void setGt(IGestionTipos gt) {
		this.gt = gt;
	}

	public IGestionDocumento getGd() {
		return gd;
	}

	public void setGd(IGestionDocumento gd) {
		this.gd = gd;
	}

	public boolean isVerPopup() {
		return verPopup;
	}

	public void setVerPopup(boolean verPopup) {
		this.verPopup = verPopup;
	}

	public String getPopupCabecera() {
		return popupCabecera;
	}

	public void setPopupCabecera(String popupCabecera) {
		this.popupCabecera = popupCabecera;
	}

	public String getPopupCuerpo() {
		return popupCuerpo;
	}

	public void setPopupCuerpo(String popupCuerpo) {
		this.popupCuerpo = popupCuerpo;
	}
	

	public void cerrarPopup(){		
		verPopup = false;		
	}

	public List<Documento> getListaDocumentos()  {
	//	System.out.println("Entro en getlistadocumentos"+this.getClass().getName());
		this.ordenar_tabla();		
		return listaDocumentos;
	}

	public void setListaDocumentos(List<Documento> listaDocumentos) {
		//System.out.println("Entro en setlistadocumentos"+this.getClass().getName());
		this.listaDocumentos = listaDocumentos;
	}
	
	//Popup de confirmacion de borrado Inicio
	private boolean popupEliminado = false;
	private String popupEliminadoCuerpo = "Los documentos seleccionados han sido borrados.";
	
	
	public String cerrarPopupConfirmado(){
		popupEliminado = false;
		metodoInicial();
		return "documentoEliminado";
	}
	
	public boolean isPopupEliminado() {
		return popupEliminado;
	}


	public void setPopupEliminado(boolean popupEliminado) {
		this.popupEliminado = popupEliminado;
	}


	public String getPopupEliminadoCuerpo() {
		return popupEliminadoCuerpo;
	}


	public void setPopupEliminadoCuerpo(String popupEliminadoCuerpo) {
		this.popupEliminadoCuerpo = popupEliminadoCuerpo;
	}
	
	//Popup de confirmacion de borrado Fin

	//Proceso de borrado
	private String preguntaEliminar =  new String();
	private Documento docAEliminar;
	private String etiquetaEliminar ="Eliminar";
	private boolean popupEliminarDoc = false;
	
	
	@Transactional
	public void eliminarDocSeleccionado(ActionEvent event){
		try{
			gd.eliminar(docAEliminar);
			popupEliminarDoc = false;
			popupEliminado = true;
		}catch (RuntimeException re) {
			popupCabecera = new String();
			popupCabecera += "ERROR";
			popupCuerpo = new String();
			popupCuerpo += "Hubo un error al eliminar el documento.";
			log.debug("Error "+re.getLocalizedMessage());
			//TODO enviar email con el error producido. y su log.
			verPopup = true;
		}
		
	}
	
	public void noEliminar(){
		System.out.println("Entor en no ELIMINAR");
		popupEliminarDoc = false;
	}
	
	public void documentoElegido(RowSelectorEvent evento) {
		int fila = evento.getRow();
		preguntaEliminar = new String();
		docAEliminar = listaDocumentos.get(fila);
		preguntaEliminar += "Seguro que desea borrar el siguiente documento:\n";
		preguntaEliminar += docAEliminar.getNombre()+"\n";
		preguntaEliminar += docAEliminar.getDescripcion();
		popupEliminarDoc=true;

		/*
		b_alta = true;
		b_resto = false;
		fila = evento.getRow();
		Usuarios_Datatable usu = lista_dt.get(fila);
		String id = ((UIComponent) evento.getSource()).getId();
		String clienteid = ((UIComponent) evento.getSource())
				.getClientId(FacesContext.getCurrentInstance());

		List<UIComponent> lista_com = FacesContext.getCurrentInstance()
				.getViewRoot().getChildren();

		for (UIComponent compo : lista_com) {
			System.out.println("SOY EL COMPONENTE " + compo.getId());
		}
		// UIComponent panel_formulario = FacesContext.getCurrentInstance()
		// .getViewRoot().findComponent(
		// "formu:panel_administracion:0:panel_datos_formu");

		UIComponent panel_formulario = evento.getComponent().findComponent(
				"formu_administracion:panel_opciones:0:nombre_usu");
		// panel_formulario.setRendered(true);
		setNombreUsuario(usu.getNombreUsuario());
		setPassword(usu.getPassword());
		setFechaAlta(usu.getFechaAlta());
		setFechaBaja(usu.getFechaBaja());
*/
	}
	
	


	public boolean isPopupEliminarDoc() {
		return popupEliminarDoc;
	}

	public void setPopupEliminarDoc(boolean popupEliminarDoc) {
		this.popupEliminarDoc = popupEliminarDoc;
	}

	public String getPreguntaEliminar() {
		return preguntaEliminar;
	}

	public void setPreguntaEliminar(String preguntaEliminar) {
		this.preguntaEliminar = preguntaEliminar;
	}

	public Documento getDocAEliminar() {
		return docAEliminar;
	}

	public void setDocAEliminar(Documento docAEliminar) {
		this.docAEliminar = docAEliminar;
	}

	public String getEtiquetaEliminar() {
		return etiquetaEliminar;
	}

	public void setEtiquetaEliminar(String etiquetaEliminar) {
		this.etiquetaEliminar = etiquetaEliminar;
	}

	
	//Metodos para ordenar la tabla.
	private String columna_a_ordenar;
	private String columna_anteriorordenada;
	private boolean sentido_ordenacion;
	private boolean sentido_ordenacionanterior;
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	protected void ordenar_tabla() {
		Comparator ordenante = new Comparator() {
			public int compare(Object o1, Object o2) {
				Documento documento1 = (Documento) o1;
				Documento documento2 = (Documento) o2;
				if (columna_a_ordenar == null) {
					return 0;
				}
				if (columna_a_ordenar.equals("Nombre")) {
					return sentido_ordenacion ? documento1.getNombre()
							.compareTo(documento2.getNombre()) : documento2.getNombre().compareTo(documento1.getNombre());							
				}
				
				if (columna_a_ordenar.equals("Tipo")) {
					return sentido_ordenacion ? documento1.getTipos().getNombre()
							.compareTo(documento2.getTipos().getNombre()) : 
								documento2.getTipos().getNombre().compareTo(documento1.getTipos().getNombre());							
				}
				
				if (columna_a_ordenar.equals("Descripcion")) {
					return sentido_ordenacion ? documento1.getDescripcion()
							.compareTo(documento2.getDescripcion()) : documento2.getDescripcion().compareTo(documento1.getDescripcion());							
				}
				return 0;
			}
		};
		Collections.sort(listaDocumentos, ordenante);
	}

	public String getColumna_a_ordenar() {
		return columna_a_ordenar;
	}

	public void setColumna_a_ordenar(String columna_a_ordenar) {
		this.columna_a_ordenar = columna_a_ordenar;
	}

	public String getColumna_anteriorordenada() {
		return columna_anteriorordenada;
	}

	public void setColumna_anteriorordenada(String columna_anteriorordenada) {
		this.columna_anteriorordenada = columna_anteriorordenada;
	}

	public boolean isSentido_ordenacion() {
		return sentido_ordenacion;
	}

	public void setSentido_ordenacion(boolean sentido_ordenacion) {
		this.sentido_ordenacion = sentido_ordenacion;
	}

	public boolean isSentido_ordenacionanterior() {
		return sentido_ordenacionanterior;
	}

	public void setSentido_ordenacionanterior(boolean sentido_ordenacionanterior) {
		this.sentido_ordenacionanterior = sentido_ordenacionanterior;
	}
	
	
}
